// function threeSum(nums) {
//   let ans = []
//   let len = nums.length
//   nums.sort((a, b) => a - b)
//   for (let i = 0; i < nums.length - 2; i++) {
//     let j = i + 1
//     let k = len - 1
//     if (i > 0 && nums[i] === nums[i - 1]) {
//       continue
//     }
//     while (j < k) {
//       let sum = nums[i] + nums[j] + nums[k]
//       if (sum > 0) {
//         k--
//         while (j < k && nums[k + 1] === nums[k]) {
//           k--
//         }
//       } else if (sum < 0) {

//         j++
//         while (j < k && nums[j - 1] === nums[j]) {
//           j++
//         }

//       } else {
//         ans.push([nums[i], nums[j], nums[k]])
//         k--
//         while (j < k && nums[k + 1] === nums[k]) {
//           k--
//         }
//         j++
//         while (j < k && nums[j - 1] === nums[j]) {
//           j++
//         }
//       }
//     }
//   }

//   return ans
// }
// threeSum([-1, 0, 1, 2, -1, -4])



// redo
function threeSum(nums) {
  let len = nums.length
  let res = []
  // 先进行数组排序
  nums.sort((a, b) => a - b)
  for (let i = 0; i < len - 2; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) {
      // 跳过重复值
      continue
    }
    // 固定一个值
    let cur = nums[i]
    // 定义首尾指针
    let j = i + 1
    let k = len - 1
    while (j < k) {
      let sum = cur + nums[j] + nums[k]
      if (sum > 0) {
        // 值小 右指针左移
        k--
        while (j < k && nums[k + 1] === nums[k]) {
          k--
        }
      } else if (sum < 0) {
        // 值大，左指针右移

        j++
        while (j < k && nums[j - 1] === nums[j]) {
          j++
        }

      } else {
        // 和为0
        res.push([cur, nums[j], nums[k]])
        k--
        while (j < k && nums[k + 1] === nums[k]) {
          k--
        }
        j++
        while (j < k && nums[j - 1] === nums[j]) {
          j++
        }
      }
    }
  }

  return res
}
threeSum([-1, 0, 1, 2, -1, -4])
